[串口通讯]关于发送指令时的 CHECKSUM,帮忙解析下通讯协议。

来源:百度知道 编辑:UC知道 时间:2024/05/23 15:04:39
通讯协议中对于发送的指令中的 SUM (CHECKSUM) 段的规定如下:

SUM (CHECKSUM), 数据桢的校验码:CHECKSUM 的计算是:整个数据桢中除SOI , EOI和SUM本身之外的其他字符,按发送的ASCII码累加求和(双字节和),将结果模65536后取补运算(余数取反加1)。高位在前,低位在后。

那么在如下指令 (已将SOI , EOI删除掉)

10 01 80 4A 80 08 F2 E2 BA 03
HEX:
31 30 30 31 38 30 34 41 38 30 30 38 46 32 45 32 42 41 30 33
ASCII:
49 48 48 49 56 48 52 65 56 48 48 56 70 50 69 50 66 65 48 51

根据监听串口 得到程序发送的CHECKSUM是:FB BC

那么这里的的FB BC 到底是怎么计算的呢
我把ASCII累加的结果 也就是 49+48+48+49... 得到的结果是 1092
模65536再取反 也是-1093 和 FB BC (64444)对不上……

就也是不清楚如何根据指令 得到应该发送的 CHECKSUM
协议上说的 ASCII码累加求和(双字节和) 双字节求和 具体是什么
@e_zhangdan
65536-1092=64444 这个结果确实对上了

如果1092按位取反 1092的二进制为10001000100 高位补零 0000010001000100
按位取反得到 1111101110111011 结果也只是 64443
郁闷了……

除非通讯协议上说得模糊 所谓的 取补运算 我用C#中~符号直接对1092取补只得到-1093
而按我上述方法按位取反加1才行 根本不是取补
现在唯一概念有些不清楚的是 为什么65536直接减1092可以得到和按位取反一样的结果呢

我的最初理解:
双字节求和就是把49 48看成一个双字,49是高8位,48是低8位。值应该是49*256 + 48 = 12592.
这样的和是144402。但是最后取摸再取反的结果还是对不上。

但是我仔细看了一下你的计算结果。每个字节直接相加,和是1092,取摸后1092,取反按位取反,或者这么算也可以:65536-1092=64444. 即FB BC.

你已经对了。呵呵

===============================================================
几个容易混淆的运算:
取反:所有位按位取反。比如:0000 0101 取反变成 1111 1010。
取补码:符号位不变,其余位取反加一。比如-5的原码1000 0101 取补码变成 1111 1011。
取补(有的书上叫“取相反数”):连同符号位在内,取反加一。比如-5的补码1111 1011取相反数,得到0000 0101,即5。

“取补码”和“取补”一定是针对带符号数的。“取补码”是不改变数值,用补码形式表示这个数;而“取补”是数值改变了,就是取原数相反数的补码。

其实,“取补”就相当于“取反”后加1。